# capital.R

e_inteiro <- function(n) floor(n) == n

NAnos <- function(T)
	T[length(T)]-T[1]+1

MediaDanos <- function(T, X)
	sum(X) / NAnos(T)

Ccoef <- function(T, X, ccoef)
	ccoef * MediaDanos(T, X)

# descrição dos argumentos das funções:
# T  - ano de cada furacão  (a começar em 0)
# X  - dano de cada furacão
# u0 - capital inicial
# c  - prémio

TestaRuina_PremioFixo <- function(T, X, u0, c., rtnCapital)
{
	# versão optimizada para prémio fixo

	U <- u0 + c.*T - cumsum(X)
	if(rtnCapital)
		return(data.frame(T=T, U=U))
	!all(U >= 0)
}

TestaRuina_PremioAdj <- function(T, X, u0, c0, cadj, nanos, rtnCapital)
{
	# pode retornar capital U ou apenas prob-risco (T/F)

	# vamos querer parar no ciclo:
	# 1. cada vez q há um furacão
	# 2. no final de cada ano para recebermos os prémios

	T. <- sort(c(T, 1:nanos))
	U <- c(u0) ; T <- c(0)
	u <- u0   # capital
	c. <- c0  # prémio actual
	sx <- 0   # danos acumulados ao longo do ano
	i  <- 1   # indice das indeminizações
	lt <- 0
	for(t in T.) {
		if(rtnCapital) {
			U[length(U)+1] <- u + (t-lt)*c.
			T[length(T)+1] <- t
		}
		u <- u + (t-lt)*c.  # ir colectando prémios

		## fim do ano -- recalcular prémio
		if(e_inteiro(t) && t != lt) {
			c. <- cadj*sx + (1-cadj)*c.
			sx <- 0
		}
		## furacão -- pagar indeminização
		else {
			if(rtnCapital) {
				U[length(U)+1] <- u - X[i]
				T[length(T)+1] <- t
			}
			u <- u - X[i]
			sx <- sx+X[i]
			i <- i+1
			if(u < 0 && !rtnCapital)
				return(TRUE)
		}
		lt <- t
	}
	if(rtnCapital)
		return(data.frame(U=U, T=T))
	FALSE
}

## Gerador de Dados

rexpanos <- function(nanos, lambda)
{
	T <- cumsum(rexp(lambda*nanos, rate=1/lambda))
	lT <- T[length(T)]
	while((lT <- T[length(T)]) < nanos)
		T <- c(T, cumsum(rexp(100, rate=1/lambda)) + lT)
	T[T < nanos]
}

SimulaGammaOld <- function(nanos, Danos)
{
	E <- mean(Danos) ; V <- var(Danos)
	alpha <- (E^2)/V
	beta <- E/V

	nfuracoes <- length(Danos)
	T <- rexpanos(nanos, nanos/nfuracoes)
	X <- rgamma(length(T), shape=alpha, scale=1/beta)
	data.frame(T=T, X=X)
}

